package ve.com.wayoyo.wuml_case.DibujoDiagramas;

import java.util.ArrayList;

import ve.com.wayoyo.wuml_case.R;
import ve.com.wayoyo.wuml_case.UserPref;
import ve.com.wayoyo.wuml_case.DibujoDiagramas.CompConector._arrowType;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.LinearLayout;
import android.widget.RadioButton;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;

public class EditarConector extends Dialog  {

	private LinearLayout _conector;
	private LinearLayout _padre;
	private LinearLayout _hijo;
	private CompConector _connectorSelected;
	private Componente _compPadre;
	private Componente _compHijo;

	private int _conectorPadre;
	private int _conectorHijo;
	private int _lineType;

	private static final int ASOCIACION_PADRE = 1;
	private static final int ASOCIACION_HIJO = 2;
	private static final int GENERALIZACION_PADRE = 3;
	private static final int GENERALIZACION_HIJO = 4;
	private static final int COMPOSICION_PADRE = 5;
	private static final int COMPOSICION_HIJO = 6;
	private static final int AGREGACION_PADRE = 7;
	private static final int AGREGACION_HIJO = 8;
	private static final int REALIZACION_PADRE = 9;
	private static final int REALIZACION_HIJO = 10;
	private static final int DASHED_PADRE = 11;
	private static final int DASHED_HIJO = 12;
	private static final int ASOCIACION_DIRECTA_PADRE = 13;
	private static final int ASOCIACION_DIRECTA_HIJO = 14;
	private static final int DEPENDENCIA_PADRE = 15;
	private static final int DEPENDENCIA_HIJO = 16;	

	private RadioGroup GroupPadre = new RadioGroup(getContext());
	private RadioGroup GroupHijo = new RadioGroup(getContext());

	public EditarConector(Context context) {
		super(context);
	}

	public void alert(String mensaje) {
		Toast.makeText(this.getContext(), mensaje, Toast.LENGTH_SHORT).show();
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {	
		super.onCreate(savedInstanceState);
		setContentView(R.layout.modificar_conector_layout);
		setTitle("Modificar Conector");
		int pageWidth = UserPref.getInstancia().getWinWidth();
		int pageHeight = UserPref.getInstancia().getWinHeight();
		LayoutParams params = getWindow().getAttributes();
		if (pageWidth<250){
			params.width = pageWidth;
			params.height = pageHeight;
		}else{
			params.width = 400;
			params.height = 550;   
		}		     
		getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);		
		_connectorSelected = VistaDiagrama.getVista().getDiagrama()._SelectedConector;
		_compPadre = VistaDiagrama.getVista().getDiagrama().getComponenteById(_connectorSelected.get_fatherId());
		_compHijo = VistaDiagrama.getVista().getDiagrama().getComponenteById(_connectorSelected.get_childId());
		_conector = (LinearLayout)findViewById(R.id.globalLayout);
		_padre = (LinearLayout)findViewById(R.id.padreLayout);
		_padre.removeAllViewsInLayout();
		_hijo = (LinearLayout)findViewById(R.id.hijoLayout);
		_hijo.removeAllViewsInLayout();

		_padre.setGravity(Gravity.CENTER);
		_hijo.setGravity(Gravity.CENTER);

		this.getRadioGroups(VistaDiagrama.getVista().getDiagrama().getTipo());

		this.setGuardar();

	}

	private void getRadioGroups (String tipo){
		if (tipo.equals("Clases")){
			TextView text = new TextView(getContext());
			text.setTextSize(25);
			text.setText(_compPadre.getTitulo());
			_padre.addView(text);
			this.getRadioGroupPadreClases("");
			_padre.addView(GroupPadre);
			this.getRadioGroupHijoClases("");			
			text = new TextView(getContext());
			text.setTextSize(25);
			text.setText(_compHijo.getTitulo());
			_hijo.addView(text);
			_hijo.addView(GroupHijo);
			this.isherenciaMultiple();
			this.setOnChangeGroupPadre(_compPadre.getTipo());
			this.setOnChangeGroupHijo(_compHijo.getTipo());			
		}
	}

	private void isherenciaMultiple() {
		boolean ret_padre = true;
		boolean ret_hijo = true;
		boolean ret_final = false;

		for (CompConector conector : _compPadre.get_conectorsBegining()) {			
			if ((conector.get_childArrowType() == _arrowType.Herencia)&&(!_connectorSelected.equals(conector)))
				ret_padre = false;
			
			if ((_compPadre.getID()==conector.get_childId())&&(_compHijo.getID()==conector.get_fatherId()))
				ret_final = true;
		}
		for (CompConector conector : _compPadre.get_conectorsEnd()) {
			if ((conector.get_fatherArrowType() == _arrowType.Herencia)&&(!_connectorSelected.equals(conector)))
				ret_padre = false;
			
			if ((_compPadre.getID()==conector.get_childId())&&(_compHijo.getID()==conector.get_fatherId()))
				ret_final = true;
		}
		for (CompConector conector : _compHijo.get_conectorsBegining()) {
			if ((conector.get_childArrowType() == _arrowType.Herencia)&&(!_connectorSelected.equals(conector)))
				ret_hijo = false;	
			
			if ((_compPadre.getID()==conector.get_fatherId())&&(_compHijo.getID()==conector.get_childId()))
				ret_final = true;
		}
		for (CompConector conector : _compHijo.get_conectorsEnd()) {
			if ((conector.get_fatherArrowType() == _arrowType.Herencia)&&(!_connectorSelected.equals(conector)))
				ret_hijo = false;	
			
			if ((_compPadre.getID()==conector.get_fatherId())&&(_compHijo.getID()==conector.get_childId()))
				ret_final = true;
		}
		if (((ret_final)&&(!ret_padre))||((ret_final)&&(!ret_hijo))){
			((RadioButton)GroupHijo.getChildAt(3)).setEnabled(false);
			((RadioButton)GroupPadre.getChildAt(3)).setEnabled(false);
		}
		if (!ret_padre)
			((RadioButton)GroupHijo.getChildAt(3)).setEnabled(false);
		if (!ret_hijo)
			((RadioButton)GroupPadre.getChildAt(3)).setEnabled(false);
		
	}

	private void setGuardar() {
		LinearLayout layoutButton = new LinearLayout(getContext());
		Button buttonOk = new Button(getContext());
		buttonOk.setText("Guardar");
		layoutButton.addView(buttonOk);		
		buttonOk.setOnClickListener(new Button.OnClickListener() {
			public void onClick(View v) {
				if ((_conectorPadre==EditarConector.ASOCIACION_PADRE)||(_conectorPadre == EditarConector.DASHED_PADRE))
					_connectorSelected.set_fatherArrowType(_arrowType.Asociacion);
				else if((_conectorPadre==EditarConector.GENERALIZACION_PADRE)||(_conectorPadre == EditarConector.REALIZACION_PADRE))
					_connectorSelected.set_fatherArrowType(_arrowType.Herencia);
				else if((_conectorPadre==EditarConector.ASOCIACION_DIRECTA_PADRE)||(_conectorPadre == EditarConector.DEPENDENCIA_PADRE))
					_connectorSelected.set_fatherArrowType(_arrowType.Asociacion_Directa);
				else if((_conectorPadre==EditarConector.AGREGACION_PADRE))
					_connectorSelected.set_fatherArrowType(_arrowType.Agregacion);
				else if((_conectorPadre==EditarConector.COMPOSICION_PADRE))
					_connectorSelected.set_fatherArrowType(_arrowType.Composicion);
				if ((_conectorHijo==EditarConector.ASOCIACION_HIJO)||(_conectorHijo== EditarConector.DASHED_HIJO))
					_connectorSelected.set_childArrowType(_arrowType.Asociacion);
				else if((_conectorHijo ==EditarConector.GENERALIZACION_HIJO)||(_conectorHijo == EditarConector.REALIZACION_HIJO))
					_connectorSelected.set_childArrowType(_arrowType.Herencia);
				else if((_conectorHijo==EditarConector.ASOCIACION_DIRECTA_HIJO)||(_conectorHijo== EditarConector.DEPENDENCIA_HIJO))
					_connectorSelected.set_childArrowType(_arrowType.Asociacion_Directa);
				else if((_conectorHijo==EditarConector.AGREGACION_HIJO))
					_connectorSelected.set_childArrowType(_arrowType.Agregacion);
				else if((_conectorHijo==EditarConector.COMPOSICION_HIJO))
					_connectorSelected.set_childArrowType(_arrowType.Composicion);
				_connectorSelected.set_currentLineType(_lineType);
				EditarConector.this.dismiss();
				VistaDiagrama.getVista().invalidate();		
			}
		});
		_conector.addView(layoutButton);		
	}

	private void setOnChangeGroupHijo(String tipo) {
		GroupHijo.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				_conectorHijo = checkedId;
				_padre.removeAllViews();
				TextView text = new TextView(getContext());
				text.setTextSize(25);
				text.setText(_compPadre.getTitulo());
				_padre.addView(text);
				GroupPadre= new RadioGroup(getContext());
				if ((checkedId == EditarConector.AGREGACION_HIJO)||
						(checkedId == EditarConector.ASOCIACION_HIJO)||
						(checkedId == EditarConector.ASOCIACION_DIRECTA_HIJO)||
						(checkedId == EditarConector.GENERALIZACION_HIJO)||
						(checkedId == EditarConector.COMPOSICION_HIJO))
				{
					EditarConector.this.getRadioGroupPadreClases("no-dashed");
					_conectorPadre = ASOCIACION_PADRE;
					_lineType = CompConector.NORMAL_TYPE;
				}else{
					EditarConector.this.getRadioGroupPadreClases("dashed");
					_conectorPadre = ASOCIACION_PADRE;
					_lineType = CompConector.DASHED_TYPE;
				}	
				_padre.addView(GroupPadre);
				EditarConector.this.isherenciaMultiple();
				EditarConector.this.setOnChangeGroupPadre(_compPadre.getTipo());
			}
		});
	}

	private void setOnChangeGroupPadre(String tipo) {
		GroupPadre.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
			public void onCheckedChanged(RadioGroup group, int checkedId) {
				_conectorPadre = checkedId;
				_hijo.removeAllViews();
				TextView text = new TextView(getContext());
				text.setTextSize(25);
				text.setText(_compHijo.getTitulo());
				_hijo.addView(text);
				GroupHijo= new RadioGroup(getContext());
				if ((checkedId == EditarConector.AGREGACION_PADRE)||
						(checkedId == EditarConector.ASOCIACION_PADRE)||
						(checkedId == EditarConector.ASOCIACION_DIRECTA_PADRE)||
						(checkedId == EditarConector.GENERALIZACION_PADRE)||
						(checkedId == EditarConector.COMPOSICION_PADRE))
				{
					EditarConector.this.getRadioGroupHijoClases("no-dashed");
					_conectorHijo = ASOCIACION_HIJO;
					_lineType = CompConector.NORMAL_TYPE;
				}else{
					EditarConector.this.getRadioGroupHijoClases("dashed");
					_conectorHijo= DASHED_HIJO;
					_lineType = CompConector.DASHED_TYPE;
				}	
				_hijo.addView(GroupHijo);
				EditarConector.this.isherenciaMultiple();
				EditarConector.this.setOnChangeGroupHijo(_compHijo.getTipo());
			}
		});		
	}

	private void getRadioGroupPadreClases(String conectorPadre){	

		//Asociacion
		RadioButton asociacion = new RadioButton(getContext());
		asociacion.setBackgroundResource(R.drawable.asociacion);
		asociacion.setId(EditarConector.ASOCIACION_PADRE);
		GroupPadre.addView(asociacion);		

		//Asociacion Directa
		RadioButton directAsociation = new RadioButton(getContext());
		directAsociation.setBackgroundResource(R.drawable.asociacion_directa);
		directAsociation.setId(EditarConector.ASOCIACION_DIRECTA_PADRE);
		GroupPadre.addView(directAsociation);

		//Dependencia
		RadioButton dependencia = new RadioButton(getContext());
		dependencia.setBackgroundResource(R.drawable.dependencia);
		dependencia.setId(EditarConector.DEPENDENCIA_PADRE);
		GroupPadre.addView(dependencia);

		//Generalizacion
		RadioButton generalizacion = new RadioButton(getContext());
		generalizacion.setBackgroundResource(R.drawable.generalizacion);
		generalizacion.setId(EditarConector.GENERALIZACION_PADRE);
		GroupPadre.addView(generalizacion);

		//Composicion
		RadioButton composicion = new RadioButton(getContext());
		composicion.setBackgroundResource(R.drawable.composicion);
		composicion.setId(EditarConector.COMPOSICION_PADRE);
		GroupPadre.addView(composicion);

		//agregacion
		RadioButton agregacion = new RadioButton(getContext());
		agregacion.setBackgroundResource(R.drawable.agregacion);
		agregacion.setId(EditarConector.AGREGACION_PADRE);
		GroupPadre.addView(agregacion);

		//Realizacion 
		RadioButton realizacion = new RadioButton(getContext());
		realizacion.setBackgroundResource(R.drawable.realizacion);
		realizacion.setId(EditarConector.REALIZACION_PADRE);
		GroupPadre.addView(realizacion);

		//Dashed 
		RadioButton dashed = new RadioButton(getContext());
		dashed.setBackgroundResource(R.drawable.dashed);
		dashed.setId(EditarConector.DASHED_PADRE);
		GroupPadre.addView(dashed);



		//		if ((!this.isherenciaMultiple(_compPadre))||(!this.isherenciaMultiple(_compHijo)))
		//			generalizacion.setEnabled(false);


		if (_compPadre instanceof CompInterface) {
			generalizacion.setEnabled(false);
			composicion.setEnabled(false);
			agregacion.setEnabled(false);
			directAsociation.setEnabled(false);
			dependencia.setEnabled(false);
		}else {
			realizacion.setEnabled(false);
		}

		if (_compHijo instanceof CompInterface) {
			generalizacion.setEnabled(false);
		}else {
			realizacion.setEnabled(false);
		}

		if (conectorPadre.equals("no-dashed")){			
			asociacion.setChecked(true);
		}else if (conectorPadre.equals("dashed")){
			dashed.setChecked(true);
		}

		if (conectorPadre.equals("")){
			if ((_connectorSelected.get_fatherArrowType()==_arrowType.Asociacion)&&(_connectorSelected.get_currentLineType()==CompConector.NORMAL_TYPE))//asociacion
				asociacion.setChecked(true);
			else if ((_connectorSelected.get_fatherArrowType()==_arrowType.Asociacion)&&(_connectorSelected.get_currentLineType()==CompConector.DASHED_TYPE))//dashed
				dashed.setChecked(true);
			else if ((_connectorSelected.get_fatherArrowType()==_arrowType.Herencia)&&(_connectorSelected.get_currentLineType()==CompConector.NORMAL_TYPE))//generalizacion
				generalizacion.setChecked(true);
			else if ((_connectorSelected.get_fatherArrowType()==_arrowType.Herencia)&&(_connectorSelected.get_currentLineType()==CompConector.DASHED_TYPE))//realizacion
				realizacion.setChecked(true);
			else if ((_connectorSelected.get_fatherArrowType()==_arrowType.Asociacion_Directa)&&(_connectorSelected.get_currentLineType()==CompConector.NORMAL_TYPE))//asociacion directa
				directAsociation.setChecked(true);
			else if ((_connectorSelected.get_fatherArrowType()==_arrowType.Asociacion_Directa)&&(_connectorSelected.get_currentLineType()==CompConector.DASHED_TYPE))//dependencia
				dependencia.setChecked(true);
			else if ((_connectorSelected.get_fatherArrowType()==_arrowType.Agregacion)&&(_connectorSelected.get_currentLineType()==CompConector.NORMAL_TYPE))//agregacion
				agregacion.setChecked(true);
			else if ((_connectorSelected.get_fatherArrowType()==_arrowType.Composicion)&&(_connectorSelected.get_currentLineType()==CompConector.NORMAL_TYPE))//composicion
				composicion.setChecked(true);						
		}
	}

	private void getRadioGroupHijoClases(String conectorHijo){	

		//Asociacion
		RadioButton asociacion = new RadioButton(getContext());
		asociacion.setBackgroundResource(R.drawable.asociacion);
		asociacion.setId(EditarConector.ASOCIACION_HIJO);
		GroupHijo.addView(asociacion);		

		//Asociacion Directa
		RadioButton directAsociation = new RadioButton(getContext());
		directAsociation.setBackgroundResource(R.drawable.asociacion_directa);
		directAsociation.setId(EditarConector.ASOCIACION_DIRECTA_HIJO);
		GroupHijo.addView(directAsociation);

		//Dependencia
		RadioButton dependencia = new RadioButton(getContext());
		dependencia.setBackgroundResource(R.drawable.dependencia);
		dependencia.setId(EditarConector.DEPENDENCIA_HIJO);
		GroupHijo.addView(dependencia);

		//Generalizacion
		RadioButton generalizacion = new RadioButton(getContext());
		generalizacion.setBackgroundResource(R.drawable.generalizacion);
		generalizacion.setId(EditarConector.GENERALIZACION_HIJO);
		GroupHijo.addView(generalizacion);

		//Composicion
		RadioButton composicion = new RadioButton(getContext());
		composicion.setBackgroundResource(R.drawable.composicion);
		composicion.setId(EditarConector.COMPOSICION_HIJO);
		GroupHijo.addView(composicion);

		//agregacion
		RadioButton agregacion = new RadioButton(getContext());
		agregacion.setBackgroundResource(R.drawable.agregacion);
		agregacion.setId(EditarConector.AGREGACION_HIJO);
		GroupHijo.addView(agregacion);

		//Realizacion 
		RadioButton realizacion = new RadioButton(getContext());
		realizacion.setBackgroundResource(R.drawable.realizacion);
		realizacion.setId(EditarConector.REALIZACION_HIJO);
		GroupHijo.addView(realizacion);

		//Dashed 
		RadioButton dashedHijo = new RadioButton(getContext());
		dashedHijo.setBackgroundResource(R.drawable.dashed);
		dashedHijo.setId(EditarConector.DASHED_HIJO);
		GroupHijo.addView(dashedHijo);
		if (conectorHijo.equals("no-dashed")){			
			asociacion.setChecked(true);
		}else if (conectorHijo.equals("dashed")){
			dashedHijo.setChecked(true);
		}



		if (_compPadre instanceof CompInterface) {
			generalizacion.setEnabled(false);
		}else {
			realizacion.setEnabled(false);
		} 

		if (_compHijo instanceof CompInterface) {
			generalizacion.setEnabled(false);
			composicion.setEnabled(false);
			agregacion.setEnabled(false);
		}else {
			realizacion.setEnabled(false);
		}

		if (conectorHijo.equals("")){
			if ((_connectorSelected.get_childArrowType()==_arrowType.Asociacion)&&(_connectorSelected.get_currentLineType()==CompConector.NORMAL_TYPE))//asociacion
				asociacion.setChecked(true);
			else if ((_connectorSelected.get_childArrowType()==_arrowType.Asociacion)&&(_connectorSelected.get_currentLineType()==CompConector.DASHED_TYPE))//dashed
				dashedHijo.setChecked(true);
			else if ((_connectorSelected.get_childArrowType()==_arrowType.Herencia)&&(_connectorSelected.get_currentLineType()==CompConector.NORMAL_TYPE))//generalizacion
				generalizacion.setChecked(true);
			else if ((_connectorSelected.get_childArrowType()==_arrowType.Herencia)&&(_connectorSelected.get_currentLineType()==CompConector.DASHED_TYPE))//realizacion
				realizacion.setChecked(true);
			else if ((_connectorSelected.get_childArrowType()==_arrowType.Asociacion_Directa)&&(_connectorSelected.get_currentLineType()==CompConector.NORMAL_TYPE))//asociacion directa
				directAsociation.setChecked(true);
			else if ((_connectorSelected.get_fatherArrowType()==_arrowType.Asociacion_Directa)&&(_connectorSelected.get_currentLineType()==2))//dependencia
				dependencia.setChecked(true);
			else if ((_connectorSelected.get_childArrowType()==_arrowType.Agregacion)&&(_connectorSelected.get_currentLineType()==CompConector.NORMAL_TYPE))//agregacion
				agregacion.setChecked(true);
			else if ((_connectorSelected.get_childArrowType()==_arrowType.Composicion)&&(_connectorSelected.get_currentLineType()==CompConector.NORMAL_TYPE))//composicion
				composicion.setChecked(true);

		}
	}

}
